﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO;
using System.Xml;
using UnityEditor;

#if UNITY_IOS
using UnityEditor.iOS.Xcode;
#endif

namespace Nirvana
{
    [CreateAssetMenu(fileName = "ProductNameI18N", menuName = "Nirvana/Build/ProductNameI18N")]
    public sealed class ProductNameI18N : ScriptableObject
    {
        [Serializable]
        private struct SystemLanguageConfig
        {
            [SerializeField]
            [Tooltip("The language for application.")]
            public I18NLanguageType Language;
            /// <summary>
            /// App名称
            /// </summary>
            [SerializeField]
            [Tooltip("The application name for this language.")]
            public string AppName;
        }
        [Tooltip("The localization product names.")]
        [SerializeField]
        private SystemLanguageConfig[] productNames;

        private static readonly Dictionary<I18NLanguageType, string> LanguageDictAndroid;
        private static readonly Dictionary<I18NLanguageType, string> LanguageDictIOS;
        static ProductNameI18N()
        {
            //国家/地区 语言缩写代码 查询备用:http://www.jctrans.com/tool/gjym.htm
            //android本地化文件目录规范，每种语言以values-xx（xx代表国家代码）的方式保存，会根据系统语言自动切换。
            //命名规范国家代码，滑动到最后找。
            //找不到就安装Androidstudio插件，自动创建对应的Values-xx文件。
            //第二步：打开 Settings -> Plugins。
            //第三步：搜索 AndroidLocalize 并安装，然后重新启动 IDE。
            //
            Dictionary<I18NLanguageType, string> _languageMap = new Dictionary<I18NLanguageType, string>();

            _languageMap.Add(I18NLanguageType.ZhChs, "values-zh-rCN");
            _languageMap.Add(I18NLanguageType.ZhCht, "values-zh-rTW");
            _languageMap.Add(I18NLanguageType.En, "values-en-rUS");
            _languageMap.Add(I18NLanguageType.Jap, "values-ja-rJP");
            _languageMap.Add(I18NLanguageType.Ko, "values-ko-rKR");

            _languageMap.Add(I18NLanguageType.Th, "values-th-rTH");
            _languageMap.Add(I18NLanguageType.Id, "values-in-rID");
            _languageMap.Add(I18NLanguageType.Ms, "values-ms-rMY");
            //_languageMap.Add(I18NLanguageType.Fil, "values-fil");
            _languageMap.Add(I18NLanguageType.Fil, "values-tl-rPH");
            _languageMap.Add(I18NLanguageType.Vi, "values-vi-rVN");

            ProductNameI18N.LanguageDictAndroid = _languageMap;

            //国家码查找：http://www.rzfanyi.com/ArticleShow.asp?ArtID=969
            //IOS本地化xx.lproj文件目录命名规范，在xcode上看吧。可以在infolist的Localizations上点+添加查看对应的国家代码。
            _languageMap = new Dictionary<I18NLanguageType, string>();
            _languageMap.Add(I18NLanguageType.ZhChs, "zh-Hans");
            _languageMap.Add(I18NLanguageType.ZhCht, "zh-Hant");
            _languageMap.Add(I18NLanguageType.En, "en");
            _languageMap.Add(I18NLanguageType.Jap, "ja");
            _languageMap.Add(I18NLanguageType.Ko, "ko");

            _languageMap.Add(I18NLanguageType.Th, "th");
            _languageMap.Add(I18NLanguageType.Id, "id");
            _languageMap.Add(I18NLanguageType.Ms, "ms");
            _languageMap.Add(I18NLanguageType.Fil, "tl");
            _languageMap.Add(I18NLanguageType.Vi, "vi");
            ProductNameI18N.LanguageDictIOS = _languageMap;

        }

        public void InitAndroidProductName()
        {
            foreach(var p in this.productNames)
            {
                string _language;
                if(ProductNameI18N.LanguageDictAndroid.TryGetValue(p.Language,out _language))
                {
                    if (!string.IsNullOrEmpty(_language))
                    {
                        string appnamepath = string.Format("Assets/Plugins/Android/res/{0}/string.xml", _language);
                        CreateStringXMLFile(appnamepath, p.AppName);
                    }
                }
            }
#if UNITY_EDITOR
            AssetDatabase.Refresh();
#endif
        }

        private void CreateStringXMLFile(string path,string appname )
        {
            if (!File.Exists(path))
            {
                string dirName = Path.GetDirectoryName(path);
                if (!Directory.Exists(dirName))
                {
                    Directory.CreateDirectory(dirName);
                }

                string msg = "<resources>\r\n    <string name=\"app_name\">{0}</string> \r\n</resources>";
                File.WriteAllText(path, string.Format(msg, appname));

            }
            else
            {
                XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.Load(path);
                XmlElement xmlElement = xmlDocument["resources"];
                if(xmlElement == null)
                {
                    throw new Exception(string.Format("The {0} format error.", path));
                }

                bool flag = false;
                foreach(var obj in xmlElement.ChildNodes)
                {
                    XmlNode node = (XmlNode)obj;
                    if(node.Name == "string")
                    {
                        XmlAttribute xmlAttribute = node.Attributes["name"];
                        if(xmlAttribute != null)
                        {
                            if(xmlAttribute.Value == "app_name")
                            {
                                node.InnerText = appname;
                                flag = true;
                            }
                        }
                    }
                }


                if(!flag)
                {

                    XmlElement xmlElement1 = xmlDocument.CreateElement("string");
                    xmlElement1.SetAttribute("name", "app_name");
                    xmlElement1.InnerText = appname;
                    xmlElement.AppendChild(xmlElement1);

                }

                string dir = Path.GetDirectoryName(path);
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }
                xmlDocument.Save(path);

            }
        }


        public void InitIOSProductName(string path)
        {
#if UNITY_IOS
            //开启本地化应用名权限
            string pathname = path + "/Info.plist";
            PlistDocument plistDocument = new PlistDocument();
            plistDocument.ReadFromFile(pathname);
            PlistElementDict plistElementDict = plistDocument.root.AsDict();
            plistElementDict.SetBoolean("LSHasLocalizedDisplayName", true);
            plistDocument.WriteToFile(pathname);
            foreach (var p in this.productNames)
            {
       
                string _language;
                if (ProductNameI18N.LanguageDictIOS.TryGetValue(p.Language, out _language))
                {
                    if (!string.IsNullOrEmpty(_language))
                    {
                        //xx.lproj 目录，这个目录下存放的就是需要国际化的文件,然后再xcode工程里面，把这些文件加入到工程。
                        string appnamepath = string.Format("{0}/{1}.lproj", path,_language);
                        if (!Directory.Exists(appnamepath))
                        {
                            Directory.CreateDirectory(appnamepath);
                        }

                        string infopliststring = appnamepath+"/InfoPlist.strings";
                        string appname = "\"CFBundleDisplayName\" =\"" + p.AppName + "\";\n";
                       // File.WriteAllText(infopliststring, appname);
                        //att 提示
                        var _t = (ConfigLanguageType)Enum.Parse(typeof(ConfigLanguageType), p.Language.ToString());
                        var tips = DataConfigLanguage.Instance.GetContentByKeyAndType(ConfigLanguageKey.ID147, _t);
                        string atttips = "\"NSUserTrackingUsageDescription\" =\"" + tips+ "\";\n"; 
                        string all = appname+atttips;
                        File.WriteAllText(infopliststring, all);
                    }
                }
            }
#endif
            foreach (var p in this.productNames)
            {

            }
            
            
          //  
        }


        public void Active()
        {
#if UNITY_ANDROID
            InitAndroidProductName();
#elif UNITY_IOS //ios需要先激活缓存数据，然后再build。直接build无法动态创建i18n app name
            XCodePostProcess.SetProductnameI18N(this);
#endif
        }


    }
}

/*
维吾尔文（中国）：values-ug-rCN

中文（中国）：values-zh-rCN

中文（台湾）：values-zh-rTW

中文（香港）：values-zh-rHK

英语（美国）：values-en-rUS

英语（英国）：values-en-rGB

英文（澳大利亚）：values-en-rAU

英文（加拿大）：values-en-rCA

英文（爱尔兰）：values-en-rIE

英文（印度）：values-en-rIN

英文（新西兰）：values-en-rNZ

英文（新加坡）：values-en-rSG

英文（南非）：values-en-rZA

阿拉伯文（埃及）：values-ar-rEG

阿拉伯文（以色列）：values-ar-rIL

保加利亚文:  values-bg-rBG

加泰罗尼亚文：values-ca-rES

捷克文：values-cs-rCZ

丹麦文：values-da-rDK

德文（奥地利）：values-de-rAT

德文（瑞士）：values-de-rCH

德文（德国）：values-de-rDE

德文（列支敦士登）：values-de-rLI

希腊文：values-el-rGR

西班牙文（西班牙）：values-es-rES

西班牙文（美国）：values-es-rUS

芬兰文（芬兰）：values-fi-rFI

法文（比利时）：values-fr-rBE

法文（加拿大）：values-fr-rCA

法文（瑞士）：values-fr-rCH

法文（法国）：values-fr-rFR

希伯来文：values-iw-rIL

印地文：values-hi-rIN

克罗里亚文：values-hr-rHR

匈牙利文：values-hu-rHU

印度尼西亚文：values-in-rID

意大利文（瑞士）：values-it-rCH

意大利文（意大利）：values-it-rIT

日文：values-ja-rJP

韩文：values-ko-rKR

立陶宛文：valueslt-rLT

拉脱维亚文：values-lv-rLV

挪威博克马尔文：values-nb-rNO

荷兰文(比利时)：values-nl-BE

荷兰文（荷兰）：values-nl-rNL

波兰文：values-pl-rPL

葡萄牙文（巴西）：values-pt-rBR

葡萄牙文（葡萄牙）：values-pt-rPT

罗马尼亚文：values-ro-rRO

俄文：values-ru-rRU

斯洛伐克文：values-sk-rSK

斯洛文尼亚文：values-sl-rSI

塞尔维亚文：values-sr-rRS

瑞典文：values-sv-rSE

泰文：values-th-rTH

塔加洛语：values-tl-rPH

土耳其文：values–r-rTR

乌克兰文：values-uk-rUA

越南文：values-vi-rVN

*/

